#pragma once

#include <bitset>
#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "Alice/Window/WindowInfo.hpp"

namespace Alice
{

// 系统需要使用事件管理器来处理用户输入
class EventMngr;

/* 
    窗口管理器
    管理 OpenGL 窗口资源
*/ 
class WindowMngr
{
public:
    WindowMngr() : m_window(nullptr) {}

    /* 
        初始化窗口
        \param title  窗口标题
        \param width  窗口宽度
        \param height 窗口高度
    */ 
    bool Init(const char* title, float width, float height);

    bool Init(WindowInfo& window_info);

    /*
        获取当前窗口信息
    */
    inline WindowInfo Info() { return m_window_info; }

    /*
        清理渲染缓冲区（清屏）
    */
    void ClearBuffer();

    /* 
        更新窗口内容
    */ 
    void Update();

    /* 
        处理窗口内事件
    */ 
    void ProcessEvents(EventMngr* event_mngr);

    /* 
        销毁窗口资源
    */ 
    void Destroy();

private:
    GLFWwindow* m_window;
    // 存储当前窗口信息
    WindowInfo m_window_info;
    // 存储当前按下的键值
    // 用于判断同时按下多个键的情况
    std::bitset<8> m_buttons;
};

} // namespace Alice
